package com.yifan.concurrency.ch3;

/**
 * 程序清单 3-1 在没有同步的情况下共享变量 （不要这么做）
 *
 *
 * NoVisibility 可能会持续循环下去，因为读线程可能永远看不到 ready 的值。
 * 一种更奇怪的现象是， NoVisibility 可能输出0 ，因为读线程可能看到了写入 ready 的值，
 * 但却没有看到之后写入 number 的值，这种现象被称为 “重排序(Reordering)”。
 *
 * 只要在某个线程中无法检测到重排序情况（即使在其他线程中可以很明显地看到该线程中的重排序），
 * 那么就无法确保线程中的操作将按照程序中指定的顺序来执行。
 *
 * 当主线程首先写入 number, 然后在没有同步的情况下写入 ready ，那么读线程看到的顺序可能与写入的顺序完全相反.
 *
 *
 * 在没有同步的情况下，编译器，处理器以及运行时等都可能对操作的执行顺序进行一些意想不同的调整。
 * 在缺乏足够同步的多线程程序中，要想对内存操作的执行顺序进行判断，几乎无法得出正确的结论。
 *
 *
 * 有一种简单的方法能避免这些复杂的问题：
 * 只有有数据在多个线程之间共享，就使用正确的同步。
 *
 */
public class NoVisibility {

    private static boolean ready;

    private static int number;


    private static class ReaderThread extends Thread {
        @Override
        public void run() {
            while (!ready) {
                Thread.yield();
            }
            System.out.println(number);
        }
    }

    public static void main(String[] args) {
        new ReaderThread().start();
        number = 42;
        ready = true;
    }
}
